class HorasController < ApplicationController
  #MODULE: Horarios
  def liquidar #DESC: Convertir las horas trabajadas en movimientos a considerar en el recibo.
    if request.method==:post
      @inicio=Date.new(params[:date][:year].to_i,params[:date][:month].to_i)
      cant=Hora.liquidar(@inicio)
      flash[:notice] =  "Se crearon #{cant} movimientos."
    end
  end

  def compensar #DESC: Pasar el saldo de horas de un mes, al mes siguinete.
    @resumen=[]
    hora=Hora.find(params[:id])
    Hora.compensar(hora)
    update_resumen(hora)
  end
  
  def resumen #DESC: Visualizar el resumende horas trabajadas.
    @resumen=[]
    if request.method==:post or params[:compensada]
      update_resumen(params)
    end
  end
  #Procesa las #marcaciones de todos los funcionarios activos, y las convierte a
  ##horas, para esto, recorre los dias del periodo especificado, genera objetos
  ##DiaMarcacion pasa como parametro este objeto a Hora.generar.
  def procesar #DESC: Convertir las marcaciones en horas.
    if request.method==:post
      h=Hora.last
      proceso_id = h ? h.proceso_id+1 : 1
      periodo=Date.new(params[:date][:year].to_i,params[:date][:month].to_i)
      usuarios=Usuario.activos.all
      periodo.beginning_of_month.upto(periodo.end_of_month) do |date|
        usuarios.each do |usuario|
          dm=DiaMarcacion.new(usuario,date)
          Hora.generar(dm,proceso_id)
        end
      end
      flash[:notice] =  'Horas generadas correctamente.'
      redirect_to(show_proceso_horas_path(:id=>proceso_id))
    end
  end

  def show_proceso #DESC: Ver las horas generadas en un proceso.
    @proceso_id=params[:id]
  end

  def datos #IGNORE
    #Realizar consulta
    #params[:filters].gsub!("usuario","usuarios.nombres") if params[:filters] and params[:filters].include?("usuario")
    registros, count = find_by_params(params, :class => Hora.por_proceso_id(params[:proceso_id]),:includes=>:usuario)
    # Construct a hash from the ActiveRecord result
    return_data = Hash.new()
    return_data[:page] = params[:page]
    return_data[:total] = (count.to_f / params[:rows].to_i).ceil
    return_data[:records] = count

    return_data[:rows] = registros.collect{|h| {:id => h.id,
        :cell => [
          h.fecha, h.motivo_texto,h.cantidad,h.valor, h.tipo_texto,h.usuario.nombres
        ]}}

    render :text => return_data.to_json, :layout => false
  end

  def borrar_proceso #DESC: Borrar las horas generadas por un proceso.
    sql = "DELETE FROM horas WHERE proceso_id = '#{params[:id]}'"
    ActiveRecord::Base.connection.execute(sql)

    respond_to do |format|
      flash[:notice] =  'Proceso borrado correctamente.'
      format.html { redirect_to(procesos_horas_url) }
      format.xml  { head :ok }
    end
  end
  # GET /horas
  # GET /horas.xml
  def procesos #DESC: Ver el listado de procesos.
    @procesos = Hora.all(:select=>"proceso_id,fecha,count(*) as total",:group =>"proceso_id")
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @horas }
    end
  end

  # GET /horas/1
  # GET /horas/1.xml
  def show 
    @hora = Hora.find(params[:id])
    
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @hora }
    end
  end

  # GET /horas/new
  # GET /horas/new.xml
  def new
    @hora = Hora.new
    @hora.proceso_id = 0
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @hora }
    end
  end

  # GET /horas/1/edit
  def edit
    @hora = Hora.find(params[:id])
  end

  # POST /horas
  # POST /horas.xml
  def create
    @hora = Hora.new(params[:hora])
    @hora.tipo = Hora.get_tipo(@hora.motivo)
    respond_to do |format|
      if @hora.save
        flash[:notice] =  'Hora creada correctamente.'
        format.html { params[:oper].nil? ? redirect_to(@hora) : render(:text => "Ok")}
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @hora.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /horas/1
  # PUT /horas/1.xml
  def update
    @hora = Hora.find(params[:id])
    respond_to do |format|
      if @hora.update_attributes(params[:hora])
        @hora.tipo = Hora.get_tipo(@hora.motivo)
        @hora.save
        flash[:notice] = 'Hora actualizada correctamente.'
        format.html { redirect_to(@hora) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @hora.errors, :status => :unprocessable_entity }
      end
    end
  end

  def matriz_horarios
    respond_to do |format|
      format.html
      format.js{update_matriz}
    end
  end
  
  # DELETE /horas/1
  # DELETE /horas/1.xml
  def destroy
    @hora = Hora.find(params[:id])
    proceso=@hora.proceso_id
    @hora.destroy

    respond_to do |format|
      format.html { redirect_to(show_proceso_horas_url(:id=>proceso)) }
      format.xml  { head :ok }
    end
  end

  private

  def update_resumen(obj)
    if obj.is_a?(Hora)
      @inicio=obj.fecha.beginning_of_month
      @usuario=obj.usuario
    else
      @inicio=Date.new(params[:date][:year].to_i,params[:date][:month].to_i)
      @usuario=Usuario.find(params[:usuario_id])
    end
    params[:tipo]||='cantidad'
    @resumen=Hora.resumen(@usuario,@inicio,params[:tipo])
    @tipo=    params[:tipo]
    render :update do |page|
      page[:resumen].replace_html :partial => "horas/resumen.html",:locals=>{:resumen=>@resumen}
    end
  end

  def update_matriz
    @area=Area.find(params[:area][:id])
    @funcionarios=Usuario.por_area(@area.id)
    render :update do |page|
      page["matriz-horarios"].replace_html :partial => "horas/matriz.html"
    end
  end
end
